# -*- coding:utf-8 -*-

# author：赵百云
import re
import tkinter as tk
import datetime
from tkinter import StringVar, SW
from tkinter import messagebox
import logging
from tkinter import ttk

from django.db.models.functions import window


class APP:
    # # 配置日志
    logging.basicConfig(filename='app.log', level=logging.INFO,
                        format='%(asctime)s:%(levelname)s:%(message)s')
    def __init__(self, width=490, height=390):

        global tishi
        self.w = width
        self.h = height
        self.title = 'Tools_SAIC'
        self.root = tk.Tk(className=self.title)
        # 定义button控件上的文字
        self.url = tk.StringVar()
        # 定义选择哪个播放源
        self.v = tk.IntVar()
        # 默认为1
        self.v.set(1)
        # Frame空间
        frame_1 = tk.Frame(self.root)
        frame_2 = tk.Frame(self.root)  # 表示国家区域
        frame_type_combo = ttk.Combobox(self.root)
        frame_type = ttk.Combobox(self.root)
        frame_li = tk.Frame(self.root)  # 创建窗口对象的背景色
        frame_esponse = tk.Frame(self.root)
        frame_esponse_strsn = tk.Frame(self.root)
        frame_esponse_tishi = tk.Frame(self.root)
        frame_mode = tk.Frame(self.root)
        frame_underside = tk.Frame(self.root)
        message_mg = tk.Frame(self.root)


        # 随机数函数生成
        def commod_random(input_text_ca, input_text_mode, input_value_vc):
            # 车项目如AS33
            CAR_MODE = input_text_mode
            # 国家区域 如 EU
            ca = input_text_ca
            # 车型类型 SN OR  vin 输入框
            Vehicle_Code = input_value_vc
            # 车型类型 SN OR  vin 下拉框

            now = datetime.datetime.now()
            date_str = now.strftime("%Y%m%d%H%M%S")
            substring = date_str[2:4]
            substring2 = date_str[4:8]
            substring3 = date_str[10:12]
            # 拼接数据
            result_strsn = ('{}{}{}{}'.format( CAR_MODE,ca,Vehicle_Code,  (substring + substring2 + substring3)))
            return result_strsn
        # 定义输入函数
        def process_input_ca(input_text_ca):
            print(f"输入的车型是: {input_text_ca}")
            pass
        def process_input_mode(input_text_mode):
            print(f"输入的车型是: {input_text_mode}")
            pass
        # 输入车型
        def process_input_type(input_text_type):
            print(f"输入的车型是: {input_text_type}")
            pass

        def show_message():
            messagebox.showinfo("标题", "这是一个信息消息框！")

        def do_commod_Randon():
            input_text_ca = entryca.get().strip()  # 获取 Entry 控件中的值
            if input_text_ca:
                process_input_ca(input_text_ca)  # 将值作为参数传递给函数
            else:
                print("输入为空或只有空格")
            input_text_mode = entryMode.get()
            process_input_mode(input_text_mode)
            # 输入框获取type sn or VIN
            # input_text_vc = entrytype.get()
            # process_input_type(input_text_vc)
            # 下拉框获取 sn or vin
            input_text_vc_combo = combo_box_Vechile_type .get()
            process_input_type(input_text_vc_combo)

             # 生成的拼接数赋值给result_strsn_all
            result_strsn_all = commod_random(input_text_ca, input_text_mode, input_text_vc_combo)
            result_strsn_all_split = result_strsn_all[0:17]   #  序列号17


            #使用列表推导式和sum函数统计列表中字符串元素的数量
            string_count = 0;
            for item in result_strsn_all_split:
                if isinstance(item, str):
                    string_count += 1
            # 判断是否是否符合规定数据个数
            if (string_count == 17):
                print("17位VIN序列号是=== %s", result_strsn_all_split)
                print("VIN或者SN的个数:",string_count)
                logging.info(f"17位VIN序列号是:  {result_strsn_all_split}")
            elif (string_count == 16):
                print("16位SN序列号是=== %s", result_strsn_all_split)
                print("VINhCCCC或者SN的个数:", string_count)
                logging.info(f"16位SN序列号是: {result_strsn_all_split}")
            else:
                print("无效数据请重新检查")
                pass
            count_to_set=string_count
            count_entry_var .set(count_to_set)  # 设置Entry控件的
            value_to_set= result_strsn_all_split
            print("result_strsn_all_split", result_strsn_all_split)
            entry_var_strsn.set(value_to_set)  # 设置Entry控件的


            # 获取最终结果
            value_to_set_strsn=commod_random(input_text_ca, input_text_mode, input_text_vc_combo)
            print("value_to_set_strsn=======", value_to_set_strsn)
            value_to_set_strsn_split = value_to_set_strsn[0:17]

            entry_var_strsn.set(value_to_set_strsn_split)

        #车型输入的entry进行验证是否符合规范车型 type text
        def reg_entry_type(entrytype):
            zh = re.compile('[\u4e00-\u9fa5(\\W)]')  # \W表示匹配任何非Unicode的单词字符相当于[^a-zA-Z0-9]中文(\u4e00-\u9fa5)
            match = zh.findall(entrytype)
            capital_letters = re.compile('[A-Z]+')
            match1 = capital_letters.findall(entrytype)
            if match:
                match = re.sub(r"\['", "", match[0])
                match = re.sub(r"\']", "", match[0])
                tishi.set('有中文或特殊字符：%s' % match)
                return False
            elif len(entrytype) > 3:
                tishi.set("长度不能大于3位")
            elif not match1:
                tishi.set("必现是大写字母")
            else:
                tishi.set("当前字符(VIN or SN)长度最大支持3位:" + entrytype)
            return True
        #国家区域输入的entry进行验证是否符合规范
        def reg_entry_ca(entryca):
            zh = re.compile('[\u4e00-\u9fa5(\\W)]')  # \W表示匹配任何非Unicode的单词字符相当于[^a-zA-Z0-9]中文(\u4e00-\u9fa5)
            match = zh.findall(entryca)
            capital_letters = re.compile('[A-Z]+')
            match1 = capital_letters.findall(entryca)
            if match:
                match = re.sub(r"\['", "", match[0])
                match = re.sub(r"\']", "", match[0])
                tishi_ca.set('有中文或特殊字符：%s' % match)
                return False
            elif len(entryca) > 3:
                tishi_ca.set("长度不能大于3位")
            elif not match1:
                tishi_ca.set("必现是大写字母")
            else:
                tishi_ca.set("当前字符长度最大支持2位:" + entryca)
            return True

        # 项目输入的entry进行验证是否符合规范
        def reg_entry_mode(entrytmode):
            zh = re.compile('[\u4e00-\u9fa5(\\W)]')  # \W表示匹配任何非Unicode的单词字符相当于[^a-zA-Z0-9]中文(\u4e00-\u9fa5)
            match = zh.findall(entrytmode)
            capital_letters = re.compile('[A-Z]+')
            match1 = capital_letters.findall(entrytmode)
            if match:
                match = re.sub(r"\['", "", match[0])
                match = re.sub(r"\']", "", match[0])
                tishi_mode.set('有中文或特殊字符：%s' % match)
                return False
            elif len(entrytmode) > 4:
                tishi_mode.set("长度不能大于4位")
            elif not match1:
                tishi_mode.set("必现是大写字母")
            else:
                tishi_mode.set("当前字符长度最大支持4位:" + entrytmode)
            return True

        reg_input_type = frame_type.register(reg_entry_type)
        reg_input_ca = frame_2.register(reg_entry_ca)
        reg_input_mode = frame_mode.register(reg_entry_mode)
        tishi = StringVar()
        tishi_ca = StringVar()
        tishi_mode = StringVar()



        # 车型 type text 输入框实现方式
        # labeltype = tk.Label(frame_type, text="输入车型type:", padx=5, pady=1)
        # entrytype = tk.Entry(frame_type,highlightthickness=1, width=15,validate="key")
        # labelTypeText = tk.Label(frame_type)
        # 车型type 下拉框实现方式
        # 创建下拉菜单
        # 创建一个Label来显示文字

        label_type_combo = tk.Label(frame_type_combo, text="请选择车type", padx=1, pady=1)
        combo_box_Vechile_type = ttk.Combobox(frame_type, width=15,values=["SN", "VIN"])
        combo_box_Vechile_type.current(1)

        # 国家码输入
        def on_limit_exceeded(var, index, value, limit):
            if len(value) > limit:
                var.set(value[:limit])
        limit_ca = 2
        # 创建StringVar并绑定trace方法
        var = tk.StringVar()
        var.trace('w', lambda name, index, mode, var=var: on_limit_exceeded(var, index, var.get(), limit_ca))
        labelca = tk.Label(frame_2, text="输入国家简称:",padx=1, pady=1)
        entryca = tk.Entry(frame_2, highlightthickness=1, width=15, validate="key",validatecommand=(reg_input_ca, '%P'),textvariable=var)
        # text="  如AS33")
        labelcaText = tk.Label(frame_2,textvariable=tishi_ca)

        # 车型输入  textvariable=self.url
        # 定义限制数
        def on_limit_exceeded(var, index, value, limit):
            if len(value) > limit:
                var.set(value[:limit])
        limit_mode = 4
        # 创建StringVar并绑定trace方法
        var = tk.StringVar()
        var.trace('w', lambda name, index, mode, var=var: on_limit_exceeded(var, index, var.get(), limit_mode))

        labelcarmode = tk.Label(frame_mode, text="输入车型： ",padx=10, pady=10)
        entryMode = tk.Entry(frame_mode, highlightthickness=1, width=15,validate="key",validatecommand=(reg_input_mode, '%P'),textvariable=var)
        # text="  如AS33"
        labelModeText = tk.Label(frame_mode,textvariable=tishi_mode)

        button = tk.Button(frame_underside, text="生成", font=('楷体', 12), fg='Purple', width=2, height=1,
                           command=do_commod_Randon, )

        # 数据回显原始数据
        labelResponse = tk.Label(frame_esponse, text="生成数据位数：    ",padx=10, pady=10)
        count_entry_var = StringVar()  # 创建一个StringVar对象
        entryesponse = tk.Entry(frame_esponse, width=30, textvariable=count_entry_var )

        # 数据回显strsn

        labelResponsestrsn  = tk.Label(frame_esponse_strsn, text="生成SVN或者VN：",padx=10, pady=10)
        entry_var_strsn = StringVar()  # 创建一个StringVar对象
        entryesponse_strsn = tk.Entry(frame_esponse_strsn, width=30, textvariable=entry_var_strsn)

        # 创建一个按钮，点击时调用show_message函数
        message_xiaoxi= tk.Button(message_mg, text="显示消息框", command=show_message)
        label_tishi = tk.Label(frame_esponse_tishi, text="SVN是17位(配置字:F190)，SN是16位(配置字:F18C) 且英文字母要求大写 ")

        # 控件布局

        # frame_1.pack()
        frame_mode.pack()
        frame_2.pack()
        frame_type_combo.pack()
        frame_type.pack()

        combo_box_Vechile_type.pack(fill=tk.X, expand=True)  # 左侧对齐，并扩展以填充剩余空间)

        frame_underside.pack()
        frame_esponse.pack()
        frame_esponse_strsn.pack()
        message_xiaoxi.pack()
        frame_esponse_tishi.pack()


        labelca.grid(row=0, column=0)
        labelcarmode.grid(row=0, column=0)
        label_type_combo.grid(row=0, column=0)
        entryca.grid(row=0, column=1)
        entryMode.grid(row=0, column=1)
        labelcaText.grid(row=0, column=2)
        labelModeText.grid(row=0, column=2)
        button.grid(row=0, column=3, ipadx=10, ipady=10)
        labelResponse.grid(row=0, column=0)
        labelResponsestrsn.grid(row=0, column=0)

        entryesponse.grid(row=0, column=2)
        entryesponse_strsn.grid(row=0, column=2)
        message_xiaoxi.grid(row=0, column=3, ipadx=10, ipady=10)
        # labelcaesponseText.grid(row=0, column=2)
        label_tishi.grid(row=0, column=0)

    """
    函数说明:生产vin号
    """

    def center(self):
        ws = self.root.winfo_screenwidth()
        hs = self.root.winfo_screenheight()
        x = int((ws / 2) - (self.w / 2))
        y = int((hs / 2) - (self.h / 2))
        self.root.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))

    """
    函数说明:loop等待用户事件
    """

    def loop(self):
        # 禁止修改窗口大小
        self.root.resizable(False, False)
        # 窗口居中
        self.center()
        self.root.mainloop()

if __name__ == '__main__':
    a = APP()  # 实例化APP对象
    a.loop()  # loop等待用户事件
